package com.eduagent.xwqeduagent.api.characterRecognition.UniversalFileRecognition;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;

/**
 * 通用OCR识别服务
 */
@Slf4j
@Service
public class UniversalFileRecognitionService {

    @Autowired
    private UniversalFileRecognitionClient recognitionClient;
    
    /**
     * 识别图片文件
     * 
     * @param file 图片文件（支持jpg/jpeg/png/bmp格式）
     * @param uid 用户ID（非必需）
     * @return OCR识别结果
     * @throws IOException 文件处理异常
     * @throws InterruptedException 请求中断异常
     */
    public UniversalFileRecognitionResult recognizeImage(MultipartFile file, String uid) throws IOException, InterruptedException {
        // 检查文件是否为空
        if (file == null || file.isEmpty()) {
            throw new IllegalArgumentException("图片文件不能为空");
        }
        
        // 获取文件名和文件格式
        String originalFilename = file.getOriginalFilename();
        String fileFormat = getFileFormat(originalFilename);
        
        // 验证文件格式
        validateImageFormat(fileFormat);
        
        // 获取文件大小
        long fileSize = file.getSize();
        
        // 检查文件大小（限制在4MB以内）
        if (fileSize > 4 * 1024 * 1024) {
            throw new IllegalArgumentException("图片大小不能超过4MB");
        }
        
        // 将文件转换为Base64编码
        byte[] fileBytes = file.getBytes();
        String base64Content = Base64.encodeBase64String(fileBytes);
        
        // 调用OCR识别API
        return recognitionClient.recognize(base64Content, fileFormat, uid);
    }
    
    /**
     * 识别本地图片文件
     * 
     * @param filePath 图片文件路径
     * @param uid 用户ID（非必需）
     * @return OCR识别结果
     * @throws IOException 文件处理异常
     * @throws InterruptedException 请求中断异常
     */
    public UniversalFileRecognitionResult recognizeLocalImage(String filePath, String uid) throws IOException, InterruptedException {
        // 检查文件是否存在
        Path path = Path.of(filePath);
        if (!Files.exists(path)) {
            throw new IllegalArgumentException("图片文件不存在：" + filePath);
        }
        
        // 获取文件格式
        String fileFormat = getFileFormat(filePath);
        
        // 验证文件格式
        validateImageFormat(fileFormat);
        
        // 获取文件大小
        long fileSize = Files.size(path);
        
        // 检查文件大小（限制在4MB以内）
        if (fileSize > 4 * 1024 * 1024) {
            throw new IllegalArgumentException("图片大小不能超过4MB");
        }
        
        // 读取文件内容并转换为Base64编码
        byte[] fileBytes = Files.readAllBytes(path);
        String base64Content = Base64.encodeBase64String(fileBytes);
        
        // 调用OCR识别API
        return recognitionClient.recognize(base64Content, fileFormat, uid);
    }
    
    /**
     * 识别Base64编码的图片
     * 
     * @param base64Content Base64编码的图片内容（不含前缀）
     * @param imageFormat 图片格式（jpg, jpeg, png, bmp）
     * @param uid 用户ID（非必需）
     * @return OCR识别结果
     * @throws IOException 请求异常
     * @throws InterruptedException 请求中断异常
     */
    public UniversalFileRecognitionResult recognizeBase64Image(String base64Content, String imageFormat, String uid) throws IOException, InterruptedException {
        // 验证Base64内容
        if (base64Content == null || base64Content.trim().isEmpty()) {
            throw new IllegalArgumentException("Base64编码内容不能为空");
        }
        
        // 验证图片格式
        validateImageFormat(imageFormat);
        
        // 调用OCR识别API
        return recognitionClient.recognize(base64Content, imageFormat, uid);
    }
    
    /**
     * 识别Base64编码的图片（使用高级参数）
     * 
     * @param request 包含高级参数的请求对象
     * @return OCR识别结果
     * @throws IOException 请求异常
     * @throws InterruptedException 请求中断异常
     */
    public UniversalFileRecognitionResult recognizeBase64ImageWithAdvancedOptions(Base64RecognitionRequest request) 
            throws IOException, InterruptedException {
        // 验证Base64内容
        if (request.getBase64Content() == null || request.getBase64Content().trim().isEmpty()) {
            throw new IllegalArgumentException("Base64编码内容不能为空");
        }
        
        // 验证图片格式
        validateImageFormat(request.getImageFormat());
        
        // 调用OCR识别API，传入高级参数
        return recognitionClient.recognizeWithAdvancedOptions(request);
    }
    
    /**
     * 识别图片文件（使用高级参数）
     * 
     * @param file 图片文件
     * @return OCR识别结果
     * @throws IOException 文件处理异常
     * @throws InterruptedException 请求中断异常
     */
    public UniversalFileRecognitionResult recognizeImageWithAdvancedOptions(
            MultipartFile file, 
            String uid,
            String resultOption,
            String resultFormat,
            String outputType,
            String exifOption,
            String alphaOption,
            String markdownElementOption,
            String sedElementOption,
            Float rotationMinAngle) throws IOException, InterruptedException {
        
        // 检查文件是否为空
        if (file == null || file.isEmpty()) {
            throw new IllegalArgumentException("图片文件不能为空");
        }
        
        // 获取文件名和文件格式
        String originalFilename = file.getOriginalFilename();
        String fileFormat = getFileFormat(originalFilename);
        
        // 验证文件格式
        validateImageFormat(fileFormat);
        
        // 获取文件大小
        long fileSize = file.getSize();
        
        // 检查文件大小（限制在4MB以内）
        if (fileSize > 4 * 1024 * 1024) {
            throw new IllegalArgumentException("图片大小不能超过4MB");
        }
        
        // 将文件转换为Base64编码
        byte[] fileBytes = file.getBytes();
        String base64Content = Base64.encodeBase64String(fileBytes);
        
        // 创建请求对象
        Base64RecognitionRequest request = new Base64RecognitionRequest();
        request.setBase64Content(base64Content);
        request.setImageFormat(fileFormat);
        request.setUid(uid);
        request.setResultOption(resultOption);
        request.setResultFormat(resultFormat);
        request.setOutputType(outputType);
        request.setExifOption(exifOption);
        request.setAlphaOption(alphaOption);
        request.setMarkdownElementOption(markdownElementOption);
        request.setSedElementOption(sedElementOption);
        request.setRotationMinAngle(rotationMinAngle);
        
        // 调用OCR识别API
        return recognitionClient.recognizeWithAdvancedOptions(request);
    }
    
    /**
     * 获取文件格式
     * 
     * @param filename 文件名
     * @return 文件格式（小写）
     */
    private String getFileFormat(String filename) {
        if (filename == null || filename.trim().isEmpty()) {
            return "jpg"; // 默认格式
        }
        
        int lastDotIndex = filename.lastIndexOf('.');
        if (lastDotIndex > 0 && lastDotIndex < filename.length() - 1) {
            return filename.substring(lastDotIndex + 1).toLowerCase();
        }
        
        return "jpg"; // 默认格式
    }
    
    /**
     * 验证图片格式是否支持
     * 
     * @param format 图片格式
     */
    private void validateImageFormat(String format) {
        if (format == null || format.trim().isEmpty()) {
            throw new IllegalArgumentException("图片格式不能为空");
        }
        
        String lowerFormat = format.toLowerCase();
        if (!lowerFormat.equals("jpg") && !lowerFormat.equals("jpeg") && 
            !lowerFormat.equals("png") && !lowerFormat.equals("bmp")) {
            throw new IllegalArgumentException("不支持的图片格式：" + format + "，仅支持jpg/jpeg/png/bmp格式");
        }
    }
} 